class Polling {
	/**
	 * 创建轮询实例
	 * @param {Function} task - 要执行的轮询方法（支持异步）
	 * @param {Function} end - 任务结束回调
	 * @param {number|number[]} [intervals=1000] - 轮询间隔（单位：毫秒）
	 *                可传入固定数值或间隔数组（失败时依次使用）
	 */
	constructor(task,intervals = 1000,end = () => {}) {
		if (!task || typeof task !== 'function') {
			throw new Error('必须提供有效的轮询方法');
		}

		this.task = task;
		this.intervals = Array.isArray(intervals) ? intervals : [intervals];
		this.end = end;
		this.currentLevel = 0; // 当前间隔级别
		this.timer = null;
		this.isActive = false;
	}

	/**
	 * 执行轮询任务
	 */
	async #execute() {
		if (!this.isActive) return;

		// 设置下次执行时间
		const interval = this.intervals[this.currentLevel];
		console.log('下次执行时间', interval / 1000 , 's后');
		this.timer = setTimeout(async () => {
			try { // 成功继续执行下一个任务 直到走完
				console.log('开始任务');
				await this.task();
				if (this.currentLevel < this.intervals.length - 1) {
					this.currentLevel += 1
					this.#execute()
				} else { // 结束轮询
					console.log('任务执行完毕');
					// 执行任务结束回调
					this.end()
					this.stop()
				}
			} catch (err) {	// 任务失败 提示异常信息
				
			}
		}, interval);
	}

	/**
	 * 启动轮询
	 */
	start() {
		if (this.isActive) return;
		this.isActive = true;
		this.#execute();
	}

	/**
	 * 停止轮询
	 */
	stop() {
		console.log('任务已被暂停');
		this.isActive = false;
		clearTimeout(this.timer);
		this.timer = null;
		this.currentLevel = 0;
	}

	/**
	 * 更新配置（支持运行时修改）
	 * @param {Object} config - 新配置项
	 * @param {number|number[]} [config.intervals] - 新间隔配置
	 * @param {Function} [config.task] - 新任务方法
	 */
	update(config = {}) {
		if (config.intervals) {
			this.intervals = Array.isArray(config.intervals) ?
				config.intervals :
				[config.intervals];
		}
		if (config.task && typeof config.task === 'function') {
			this.task = config.task;
		}
	}
}

export default Polling